﻿namespace Blaze.Framework.Loaders
{
    using UnityEngine;

    /// <summary>
    /// 用于扩展资源加载器的一些常用功能。
    /// </summary>
    public static class AssetLoaderFluentExtension
    {
        /// <summary>
        /// 设置资源加载器以异步方式加载。
        /// </summary>
        public static T AsAsync<T>(this T loader) where T : AssetLoaderBase
        {
            loader.Mode = LoadAssetMode.Async;
            return loader;
        }

        /// <summary>
        /// 设置资源加载器以同步方式加载。
        /// </summary>
        public static T AsSync<T>(this T loader) where T : AssetLoaderBase
        {
            loader.Mode = LoadAssetMode.Sync;
            return loader;
        }

        /// <summary>
        /// 启动加载器。
        /// </summary>
        public static T FluentStart<T>(this T loader) where T : AssetLoaderBase
        {
            loader.Start();
            return loader;
        }

        /// <summary>
        /// 设置当加载器即将释放时的回调。
        /// </summary>
        public static T OnDisposing<T>(this T loader, AssetLoaderCallback<T> callback) where T : AssetLoaderBase
        {
            loader.Disposing += l => { callback((T) l); };
            return loader;
        }

        /// <summary>
        /// 设置当资源加载器加载完毕后的回调。
        /// </summary>
        public static T OnFinish<T>(this T loader, AssetLoaderCallback<T> callback) where T : AssetLoaderBase
        {
            loader.AddFinishCallback(callback);
            return loader;
        }

        /// <summary>
        /// 设置资源加载器的生命周期和指定物体同步。
        /// </summary>
        public static T SetLifecycle<T>(this T loader, GameObject obj) where T : AssetLoaderBase
        {
            var lifecycle = obj.GetOrAddComponent<AssetLoaderLifecycle>();
            lifecycle.AddTarget(loader);
            return loader;
        }

        /// <summary>
        /// 设置最大重试次数，0表示不重试，-1表示无限重试。
        /// </summary>
        public static T SetMaxRetry<T>(this T loader, int maxRetry) where T : UnityWebRequestLoader
        {
            loader.MaxRetry = maxRetry;
            return loader;
        }

        /// <summary>
        /// 设置资源加载器的加载模式。
        /// </summary>
        public static T SetMode<T>(this T loader, LoadAssetMode mode) where T : AssetLoaderBase
        {
            loader.Mode = mode;
            return loader;
        }
    }
}